﻿using System;
using System.Linq;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using Business.AID;
using Data.AID;
using System.Collections.Generic;
using Business.AID.Extensions;
using System.Web;
using System.Text;
using Microsoft.SharePoint;

namespace Presentation.AID.WebPart.Presentation.AID.VWPAprovarGestor
{
    public partial class VWPAprovarGestorUserControl : UserControl
    {
        private const string Usuario = @"Usuário";
        private const string Auditoria = @"Auditoria";
        private const string RecursosHumanos = @"Recursos Humanos";
        private const string Gestor = @"Gestor";

        #region Propriedades

        private string AIDUri
        {
            get { return Dados.UriAID; }
        }
        private string AIDEmail
        {
            get { return Dados.AIDEmail; }
        }

        private string UrlGestor 
        { 
            get
            {
                return @"/SitePages/ConsultarMeta.aspx"; 
            } 
        }
        private string UrlAuditoria 
        { 
            get 
            { 
                return @"/SitePages/ConsultarMetaAuditoria.aspx"; 
            }
        }

        private int IdGoal
        {
            get { return (int)ViewState["IdMeta"]; }
            set { ViewState["IdMeta"] = value; }
        }
        private int IdForm
        {
            get 
            {
                object obj = ViewState["IdFormulario"];
                return (obj == null) ? 0 : (int)obj;
            }
            set { ViewState["IdFormulario"] = value; }
        }
        private int IdColaborador
        {
            get
            {
                object obj = ViewState["IdColaborador"];
                return (obj == null) ? 0 : (int)obj;
            }
            set { ViewState["IdColaborador"] = value; }
        }
        
        private string Approver
        {
            get
            { 
                object obj = Request.QueryString["aprovador"]; 
                return (obj == null) ? null : Request.QueryString["aprovador"]; 
            }
        }
        private int IdFormulario
        {
            get
            {
                object obj = Request.QueryString["form"];
                return (obj == null) ? 0 : Convert.ToInt32(obj.ToString());
            }
        }

        private string MensagemEmail { get; set; }
        private string MensagemDevolucao
        {
            get { return @"<p>Sua AID foi devolvida para ajustes. Para prosseguir, acesse o sistema ou <a href='{0}'>Clique aqui.</a></p>"; }
        }
        private string uriDevolucao
        {
            get { return AIDUri + @"SitePages/MinhasMetas.aspx?f={0}"; } 
        }
        private string uriAprovacao 
        {
            get { return AIDUri + @"SitePages/AprovarMeta/Aprovar.aspx?form={0}&aprovador=Auditoria"; }
        }

        private string MensagemMetaConsideracao { get; set; }

        #endregion

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                LoadForm();
            }
        }

        #region Botões

        protected void btnEnviarGestor_Click(object sender, EventArgs e)
        {
            if (AllGoalAreCommented(gdvMetas))
            {
                SetGoalApproval(gdvMetas);

                string urlDevolver = string.Format(uriDevolucao, IdForm);

                if (Approver == Gestor)
                {
                    if (isRadioButtonCheckedValue(gdvMetas, "false"))
                    {
                        /*Envia email a auditoria.*/
                        string urlAprovacao = string.Format(uriAprovacao, IdForm);
                        SendManagerForm(2, true);
                        //MailUtility.EnviarEmail(AIDEmail, "mailTo", "smtp.abdi.com.br", "mensagem");
                    }
                    else
                    {
                        /*Envia email ao colaborador.*/
                        Colaborador colaborador = new ColaboradorBO().GetEmployeeById(IdColaborador);
                        if (colaborador != null)
                        {
                            MensagemEmail = String.Format(MensagemDevolucao, urlDevolver);
                            MailUtility.EnviarEmail(AIDEmail, colaborador.Email, "smtp.abdi.com.br", MensagemEmail);
                        }
                        SendManagerForm(4, false);
                    }
                    Response.Redirect(UrlGestor);
                }

                if (Approver == Auditoria)
                {
                    CategoriaBO categoriaBO = new CategoriaBO();
                    Categoria categoria = categoriaBO.GetCategoryById(2);

                    FormularioBO formularioBO = new FormularioBO();
                    bool isAlreadyApproved = formularioBO.isAlreadyApproved(IdForm, categoria.IdCategoria);

                    if (!isAlreadyApproved)
                    {
                        SendAuditForm(5);
                        Response.Redirect(UrlAuditoria);
                    }
                    else
                    {
                        divMensagemErro.InnerHtml = @"<span>* Este formulário já foi aprovado por alguém da auditoria.</span>";
                        divMensagemErro.Visible = true;
                    }
                }
            }
            else
            {
                divMensagemErro.InnerHtml = @"<span> * Insira um comentário na(s) meta(s) marcada(s).</span>";
                divMensagemErro.Visible = true;
            }
        }

        #endregion

        #region Eventos
 
        protected void gdvMinhasMetas_DataBound(object sender, EventArgs e)
        {
            MetaBO metaBO = new MetaBO();
            List<Meta> ListaMeta = metaBO.GetAllGoalsByForm(IdForm);

            if (ListaMeta.Count > 0)
            {
                GridViewRow footer = gdvMetas.FooterRow;
                footer.Cells[0].Text = "Valor:";
                footer.Cells[2].Text = string.Format("{0}%", ListaMeta.Sum(p => p.Peso));
            }
        }
        protected void gdvMetas_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                DataKey dtKey = gdvMetas.DataKeys[e.Row.RowIndex];
                int MetaID = Convert.ToInt32(dtKey["ID"]);

                MetaBO metaBO = new MetaBO();
                Meta meta = metaBO.GetGoalById(MetaID);

                if (meta != null) 
                {
                    if (meta.PesoAlterado == true) 
                    {
                        e.Row.Cells[2].Style["color"] = "red";
                    }
                }


                if (e.Row.Cells[1].Text.ToString().Length > 200)
                {
                    e.Row.Cells[1].Text = e.Row.Cells[1].Text.ToString().Substring(0, 200) + "...";
                }

                if (e.Row.Cells[0].Text.ToString().Length > 200)
                {
                    e.Row.Cells[0].Text = e.Row.Cells[0].Text.ToString().Substring(0, 200) + "...";
                }
            }
        }
        
        #endregion

        #region Métodos Privados

        private void LoadForm()
        {
            int idForm = IdFormulario;

            string currentUser = SPContext.Current.Web.CurrentUser.LoginName;
            ColaboradorBO colaboradorBO = new ColaboradorBO();
            Colaborador currentColaborador = colaboradorBO.GetEmployeeByLogin(currentUser);

            FormularioBO formularioBO = new FormularioBO();
            Formulario formulario = formularioBO.GetFormById(idForm);

            if (formulario != null)
            {
                IdForm = formulario.Id;
                LoadFormControls(formulario);
                LoadGoals(IdForm);

                if (Approver != null && (Approver == Gestor || Approver == Auditoria) )
                {
                    StringBuilder sb = new StringBuilder();
                    if (Approver == Gestor)
                    {
                        string gestor = formulario.GestorImediato.Split(new char[] { '#' }, StringSplitOptions.RemoveEmptyEntries)[1];

                        if (gestor == currentColaborador.Nome)
                        {
                            sb.Append(@"<p>Gestor,</p><p>Com base no preenchimento realizado pelo empregado, é seu papel validar ou não as metas sugeridas.<br />A fim de facilitar a avaliação, o gestor deverá levantar as seguintes questões:</p><blockquote>•	As metas estabelecidas estão de acordo com as estratégias gerais da ABDI?</blockquote><blockquote>•	Por meio destas metas alcançaremos os resultados esperados?</blockquote><blockquote>•	Não foi esquecida alguma meta importante?</blockquote><blockquote>•	 Todas as metas elencadas são realmente importantes?</blockquote><blockquote>•	As ferramentas de medição são as mais adequadas?</blockquote><blockquote>•	Os pesos estão condizentes com as metas?</blockquote><p>Sendo necessário, é possível devolver uma ou mais metas para ajustes, informando no campo observação o que deve ser revisto.</p>");
                            
                            if (formulario.Estagio != 3)
                            {
                                gdvMetas.Enabled = false;
                                btnEnviarGestor.Enabled = false;
                                Response.Write("<script>alert('Este formulário não pode ser aprovado por você neste momento.');</script>");
                            }
                        }
                        else
                        {
                            string mensagem = "Somente o gestor imediato do colaborador, " + formulario.Nome + ", pode validar este formulário.";
                            Response.Write(@"<script> alert('" + mensagem + "'); location.href='/SitePages/ConsultarMeta.aspx'; </script>");
                        }
                    }

                    if (Approver == Auditoria)
                    {
                        sb.Append(@"<p>Auditor,</p><p>Para análise e verificação da pertinência das metas, ferramentas e pesos do formulário de AID.<br/>Sendo necessário, é possível devolver uma ou mais metas para ajustes, informando no campo observação o que deve ser revisto.</p>");
                        if (formulario.Estagio != 2)
                        {
                            gdvMetas.Enabled = false;
                            btnEnviarGestor.Enabled = false;
                            Response.Write("<script>alert('Este formulário não pode ser aprovado por você neste momento.');</script>");
                        }
                        /*if (currentColaborador.Area.Contains(""))
                        *{
                        *
                        *}
                        *else
                        *{
                        *    Response.Write("<script>alert('Somente colaboradores da Auditoria podem validar esta meta.');</script>");
                         }*/
                    }
                    lblInformativo.Text = sb.ToString();
                }
                else
                {
                    gdvMetas.Enabled = false;
                    btnEnviarGestor.Enabled = false;
                }
            }
            else
            {
                divConteudo.Visible = false;
                divMensagem.Visible = true;
            }
        }
        private void LoadFormControls(Formulario formulario)
        {
            string _area = formulario.Area == "" ? string.Empty : formulario.Area.Split(new char[] { '#' }, StringSplitOptions.RemoveEmptyEntries)[1];
            string _dataAdmissao = formulario.DtAdmissao == null ? string.Empty : formulario.DtAdmissao.ToShortDateString();
            string _funcao = formulario.Funcao == "" ? string.Empty : formulario.Funcao.Split(new char[] { '#' }, StringSplitOptions.RemoveEmptyEntries)[1];
            string _gestorImediato = formulario.GestorImediato == null ? string.Empty : formulario.GestorImediato.Split(new char[] { '#' }, StringSplitOptions.RemoveEmptyEntries)[1];
            string _matricula = formulario.Matricula == "" ? string.Empty : formulario.Matricula;
            string _nome = formulario.Nome == "" ? string.Empty : formulario.Nome;
            IdColaborador = formulario.IdColaborador;

            txtNome.Text = _nome;
            txtMatricula.Text = _matricula;
            txtGestorImediato.Text = _gestorImediato;
            txtFuncao.Text = _funcao;
            txtDtAdmissao.Text = _dataAdmissao;
            txtArea.Text = _area;
        }
        private void LoadGoals(int IdFormulario)
        {
            MetaBO metaBO = new MetaBO();
            List<Meta> ListaMeta = metaBO.GetAllGoalsByForm(IdFormulario);

            gdvMetas.DataSource = ListaMeta;
            gdvMetas.DataBind();
        }
        private void SendManagerForm(int IdProxEstagio, bool aprovacao)
        {
            int acaoId;
            if (aprovacao) { acaoId = 1; }
            else { acaoId = 2; }

            Categoria categoria = new CategoriaBO().GetCategoryById(IdProxEstagio);
            Formulario formulario = new Formulario()
            {
                Id = IdForm,
                AprovacaoGestor = aprovacao
            };

            FormularioBO formularioBO = new FormularioBO();
            formularioBO.SetFormStage(IdForm, categoria.IdCategoria);
            formularioBO.SetManagerApproval(formulario);

            string CategoriaGestor = "3";
            Historico historico = new Historico()
            {
                IdFormulario = IdForm,
                Origem = CategoriaGestor,
                Destino = categoria.IdCategoria.ToString(),
                AcaoId = acaoId
            };
            HistoricoBO historicoBO = new HistoricoBO();
            historicoBO.CreateHistory(historico);

        }
        private void SendAuditForm(int IdProxEstagio)
        {
            Categoria categoria = new CategoriaBO().GetCategoryById(IdProxEstagio);

            Formulario formulario = new Formulario()
            {
                Id = IdForm,
                AprovacaoGestor = true,
                AprovacaoAuditoria = false
            };

            FormularioBO formularioBO = new FormularioBO();
            formularioBO.SetFormStage(IdForm, categoria.IdCategoria);
            formularioBO.SetAuditApproval(formulario);

            string CategoriaAuditoria = "2";
            Historico historico = new Historico()
            {
                IdFormulario = IdForm,
                Origem = CategoriaAuditoria,
                Destino = categoria.IdCategoria.ToString(),
                AcaoId = 4
            };
            HistoricoBO historicoBO = new HistoricoBO();
            historicoBO.CreateHistory(historico);
        }

        private void SetGoalApproval(GridView gridview)
        {
            foreach (GridViewRow row in gridview.Rows)
            {
                DataKey dtKey = gridview.DataKeys[row.RowIndex];
                
                int _idMeta = Convert.ToInt32(dtKey["ID"]);
                RadioButtonList rbSelected = row.FindControl("rbdValidar") as RadioButtonList;

                string nome = rbSelected.SelectedValue;
                Boolean SelectedValue = Convert.ToBoolean(rbSelected.SelectedValue);

                string aprovacao = "";
                if (SelectedValue == true)
                {
                    aprovacao = "Aprovado";
                }
                else
                {
                    aprovacao = "Devolvido";
                }

                Meta meta = new Meta()
                {
                    Id = _idMeta,
                    Aprovacao = aprovacao,
                    ConsideracaoFeita = false,
                    PesoAlterado = false
                };

                MetaBO metaBO = new MetaBO();
                metaBO.SetGoalApproval(meta);
            }
        }
        private Boolean isRadioButtonCheckedValue(GridView gridview, string value)
        {
            foreach (GridViewRow row in gridview.Rows)
            {
                RadioButtonList rbSelected = row.FindControl("rbdValidar") as RadioButtonList;

                string _value = rbSelected.SelectedValue;

                if (value == _value)
                {
                    return false;
                }
            }
            return true;
        }
        private Boolean AllGoalAreCommented(GridView gridview)
        {
            bool flag = true;

            foreach (GridViewRow row in gridview.Rows)
            {
                DataKey dtKey = gridview.DataKeys[row.RowIndex];

                int _idMeta = Convert.ToInt32(dtKey["ID"]);
                RadioButtonList rbSelected = row.FindControl("rbdValidar") as RadioButtonList;
                Boolean SelectedValue = Convert.ToBoolean(rbSelected.SelectedValue);

                MetaBO metaBO = new MetaBO();
                Meta meta = metaBO.GetGoalById(_idMeta);

                if (!SelectedValue && !meta.ConsideracaoFeita)
                {
                    flag = false;
                    row.CssClass = "MetaSemConsideracao";
                }
                else
                {
                    if (row.RowIndex % 2 == 1)
                    {
                        row.CssClass = "AIDTabelaLinha";
                    }
                    else
                    {
                        row.CssClass = "";
                    }
                }
            }

            if (flag)
            {
                return true;
            }
            else
            {
                return false;
            }

        }
        
        #endregion

    }
}
